package main

import "fmt"

func main() {
	/*
		go 语言的数据类型：
			基本数据类型：
				int, float, bool, string
			复合数据类型：
				array, slice, map, function, pointer, struct, interface。。。

		函数变量是一种引用类型，未初始化的函数类型变量默认值为 nil

		函数的类型（两种）：
			（1）字面量类型（函数签名）：func(参数列表的数据类型)(返回值列表的数据类型)
				 有名函数 / 无名函数 的字面量类型，有名函数和无名函数的函数签名可以相同
				有名函数和无名函数的类型都是函数字面量类型

			（2）函数命名类型：type NewTypeName oldType
				简称“函数类型”
				type 定义的函数是函数命名类型（可以为其添加方法）
				eg: type F func(int, string) // F 就是函数命名类型的

					func (f F)Sad(s string) int { //为函数 F 添加方法
					}

			注：
			（1）函数类型 != 函数签名
			（2）函数如果底层相同的话，可以相互之间进行类型转换

			函数声明 = 函数名 + 函数签名
	*/
	fmt.Printf("%T\n", funn1) //func()
	fmt.Printf("%T\n", funn2) //func(int) int
	fmt.Printf("%T\n", funn3) //func(float64, int, int) (int, int)
	fmt.Printf("%T\n", funn4) //func(string, string, int, int) (string, int, float64)
}
func funn1() {}

func funn2(a int) int {
	return 0
}

func funn3(a float64, b, c int) (int, int) {
	return 0, 0
}

func funn4(a, b string, c, d int) (string, int, float64) {
	return "", 0, 0
}
